#ifndef _Miscellaneous_h
#define _Miscellaneous_h

#include "CxxUtils.h"
#include "LangUtils.h"

class DoOpMiscellaneous
{
public: 
	class ds_bind : public _DoOperator
	{
	protected: 
		ds_bind(const ds_bind &);
		ds_bind& operator=(const ds_bind &);
		
		void bind(DoProcedure *obj, DevilSemantic &state);
	public: 
		ds_bind() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};

	class ds_null : public _DoOperator
	{
	protected: 
		ds_null(const ds_null &);
		ds_null& operator=(const ds_null &);
	public: 
		ds_null() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};

	class ds_version : public _DoOperator
	{
	protected: 
		ds_version(const ds_version &);
		ds_version& operator=(const ds_version &);
	public: 
		ds_version() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};

	class ds_realtime : public _DoOperator
	{
	protected: 
		ds_realtime(const ds_realtime &);
		ds_realtime& operator=(const ds_realtime &);
	public: 
		ds_realtime() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};

	class ds_usertime : public _DoOperator
	{
	protected: 
		ds_usertime(const ds_usertime &);
		ds_usertime& operator=(const ds_usertime &);
	public: 
		ds_usertime() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};

	class ds_languagelevel : public _DoOperator
	{
	protected: 
		ds_languagelevel(const ds_languagelevel &);
		ds_languagelevel& operator=(const ds_languagelevel &);
	public: 
		ds_languagelevel() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};

	class ds_product : public _DoOperator
	{
	protected: 
		ds_product(const ds_product &);
		ds_product& operator=(const ds_product &);
	public: 
		ds_product() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};

	class ds_revision : public _DoOperator
	{
	protected: 
		ds_revision(const ds_revision &);
		ds_revision& operator=(const ds_revision &);
	public: 
		ds_revision() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};

	class ds_serialnumber : public _DoOperator
	{
	protected: 
		ds_serialnumber(const ds_serialnumber &);
		ds_serialnumber& operator=(const ds_serialnumber &);
	public: 
		ds_serialnumber() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};

	class ds_executive : public _DoOperator
	{
	protected: 
		ds_executive(const ds_executive &);
		ds_executive& operator=(const ds_executive &);
	public: 
		ds_executive() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};

	class ds_echo : public _DoOperator
	{
	protected: 
		ds_echo(const ds_echo &);
		ds_echo& operator=(const ds_echo &);
	public: 
		ds_echo() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};

	class ds_prompt : public _DoOperator
	{
	protected: 
		ds_prompt(const ds_prompt &);
		ds_prompt& operator=(const ds_prompt &);
	public: 
		ds_prompt() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
	};
	
	class ds_length : public _DoOperator
	{
	protected: 
		ds_length(const ds_length &);
		ds_length& operator=(const ds_length &);
	public: 
		ds_length() : _DoOperator() {
		}

		virtual void execute(DevilSemantic &semantic);
		
		virtual bool match(DevilSemantic &state) const;
	};

	static void push(_DoDictionaryMultimap& dict) {
		dict.put(CRefPtr< _DoObject >(new DoName("bind")), CRefPtr< _DoObject >(new ds_bind()));
		dict.put(CRefPtr< _DoObject >(new DoName("null")), CRefPtr< _DoObject >(new ds_null()));
		dict.put(CRefPtr< _DoObject >(new DoName("version")), CRefPtr< _DoObject >(new ds_version()));
		dict.put(CRefPtr< _DoObject >(new DoName("realtime")), CRefPtr< _DoObject >(new ds_realtime()));
		dict.put(CRefPtr< _DoObject >(new DoName("usertime")), CRefPtr< _DoObject >(new ds_usertime()));
		dict.put(CRefPtr< _DoObject >(new DoName("languagelevel")), CRefPtr< _DoObject >(new ds_languagelevel()));
		dict.put(CRefPtr< _DoObject >(new DoName("product")), CRefPtr< _DoObject >(new ds_product()));
		dict.put(CRefPtr< _DoObject >(new DoName("revision")), CRefPtr< _DoObject >(new ds_revision()));
		dict.put(CRefPtr< _DoObject >(new DoName("serialnumber")), CRefPtr< _DoObject >(new ds_serialnumber()));
		dict.put(CRefPtr< _DoObject >(new DoName("executive")), CRefPtr< _DoObject >(new ds_executive()));
		dict.put(CRefPtr< _DoObject >(new DoName("echo")), CRefPtr< _DoObject >(new ds_echo()));
		dict.put(CRefPtr< _DoObject >(new DoName("prompt")), CRefPtr< _DoObject >(new ds_prompt()));
		dict.put(CRefPtr< _DoObject >(new DoName("length")), CRefPtr< _DoObject >(new ds_length()));
	}
};

#endif
